// 1 any表示任意类型 unknow表示未知类型
// ts中最小的类型是never类型，表示空类型
// 2、可以吧任何值赋值给any类型的变量，并对该变量执行任何操作
// 3、可以吧任何值赋值给unknow类型的变量，但是必须进行类型检查或者类型断言才能对变量进行操作
// 4、多用unkonw少用any

/** 
 * unkonw类型要进行类型收缩
 */

function f20(x: unknown) {
  if (isFunction(x)) {
    x();
  } else {
    return x;
  }
};

let value: unknown;
let value1: unknown = value;
let value2: any = value;
// let value3: string = value;
// let value4: Function = value;
let value5: unknown = value;
let value6: unknown = value;


type T50<T> = {[P in keyof T]: number};
type T51 = T50<any>; // {[key: string]: number}
type T52 = T50<unknown>; // {}



type Arr = string[];
// 工具类型
type UnpackedArray<T> = T extends (infer R)[] ? R : T;

type newArr = UnpackedArray<Arr>; // string


// 函数重载工具类型将取最后一个函数的定义
declare function foo(x: number): number;
declare function foo(x: string): string;
declare function foo(x: string | number): string | number;


